﻿using System;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace ImageRenderControl
{
    /// <summary>
    /// 图形基类，定义所有图形的基本行为
    /// </summary>
    public abstract class Shape
    {
        // 公共属性
        public bool IsSelected { get; set; }
        public float RotationAngle { get; set; }

        // 获取旋转变换矩阵
        public Matrix RotationMatrix
        {
            get
            {
                Matrix m = new Matrix();
                PointF center = GetRotationCenter();

                // 先平移到原点，再旋转，然后平移回去
                m.Translate(center.X, center.Y);
                m.Rotate(RotationAngle);
                m.Translate(-center.X, -center.Y);

                return m;
            }
        }

        // 抽象方法
        public abstract void Draw(Graphics g);
        public abstract bool Contains(Point point);
        public abstract void Move(float dx, float dy, Func<PointF, PointF> overlayToImageTransform);

        // 新增调整大小和旋转的虚方法
        public virtual void AdjustSize(float factor, Func<PointF, PointF> overlayToImageTransform) { }
        public virtual void AdjustRotation(float angleDelta, Func<PointF, PointF> overlayToImageTransform) { }

        // 获取旋转中心点
        public virtual PointF GetRotationCenter()
        {
            // 默认实现，子类可能需要重写
            return new PointF(0, 0);
        }


        // 图像坐标转换方法
        public abstract void UpdateImageCoordinates(Func<PointF, PointF> overlayToImageTransform);

        // 当图形变换时，同步更新图像坐标
        public virtual void TransformWithImageCoordinates(
            Action<Shape> transformAction,
            Func<PointF, PointF> overlayToImageTransform)
        {
            // 执行变换
            transformAction(this);

            // 更新图像坐标
            UpdateImageCoordinates(overlayToImageTransform);
        }

    }
}